package org.example.design.factory.methodfactory;

import org.example.bean.pojo.IPhone;
import org.example.bean.pojo.MiPhone;
import org.example.design.factory.Phone;

/**
 * @author huangshen
 * @version 0
 * @description 工厂方法模式
 * @since 2022/1/29 20:22
 */
public class PhoneMethodFactory {

    /**
     *  工厂方法模式：
     *      优点：
     *          (1) 用户只需要关心产品对应的工厂，甚至无需关心创建细节或具体产品类的类名
     *          (2) 基于工厂角色和产品的多态性设计是工厂模式的关键。它能自主决定如何创建哪种产品对象，而创建细节都封装在具体工厂内部
     *          (3) 在系统要添加新的产品时，无需修改抽象工厂和抽象产品提供的接口，无需修改客户端，也无需修改其他的具体工厂和具体产品，
     *              只要添加一个具体工厂和具体产品即可，从而提高系统的可扩展性(符合开闭原则)
     *
     *      缺点：
     *          (1) 在添加新产品时，要编写新的具体产品类，并要提供与之对应的具体工厂类。系统软件个数也成对增加，从而增加了系统的复杂度，带来更多开销
     *          (2) 由于系统的可扩展性，在客户端中要引入抽象层进行定义，从而增加了系统的抽象性和理解难度
     *
     *      适用场景：
     *          (1) 客户端不需要知道它需要的对象的类。只需知道对应的工厂即可
     *          (2) 抽象工厂类通过子类来指定创建那哪个对象。即抽象工厂类只需要提供一个创建产品的接口，而由其子类确定具体要创建的对象，
     *              利用多态性和里氏代换原则，子类对象将覆盖父类对象，从而使系统更容易扩展
     */

    private  PhoneMethodFactory() {}

    public static class AppleFactoryInterface implements MethodFactoryInterface {

        @Override
        public Phone makePhone() {
            return new IPhone();
        }

    }

    public static class XiaoMiFactoryInterface implements MethodFactoryInterface {

        @Override
        public Phone makePhone() {
            return new MiPhone();
        }

    }
}
